package com.example.demopoi.generateExcel.controller;

import com.example.demopoi.generateExcel.entity.SignOutExcelJSON;
import com.example.demopoi.generateExcel.util.ExcelUtil;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

@RestController
public class TestController {

    /**
     * 导出数据到Excel 原始方法
     *
     * @param response 响应体
     *                 注意，我这里是基于Spring Boot的，全局有一个@RestController注解，所以没加@ResponseBody，
     *                 如果你的不是，请加上@ResponseBody注解
     */
    @GetMapping(value = "/out-excel-demo")
    public Object outExcelDemo(HttpServletResponse response) throws IOException {
        //创建HSSFWorkbook对象(excel的文档对象)
        HSSFWorkbook wb = new HSSFWorkbook();
        //创建sheet对象（excel的表单）
        HSSFSheet sheet = wb.createSheet("sheet1");

        //创建第一行，这里即是表头。行的最小值是0，代表每一行，上限没研究过，可参考官方的文档
        HSSFRow row1 = sheet.createRow(0);
        //在这一行创建单元格，并且将这个单元格的内容设为“账号”，下面同理。
        //列的最小值标识也是0
        row1.createCell(0).setCellValue("账号");
        row1.createCell(1).setCellValue("用户名");
        row1.createCell(2).setCellValue("日期");
        row1.createCell(3).setCellValue("是否完成");

        //第二行
        HSSFRow row2 = sheet.createRow(1);
        row2.createCell(0).setCellValue("123456");
        row2.createCell(1).setCellValue("张三");
        row2.createCell(2).setCellValue("2019-08-05");
        row2.createCell(3).setCellValue("是");

        //第三行
        HSSFRow row3 = sheet.createRow(2);
        row3.createCell(0).setCellValue("5681464");
        row3.createCell(1).setCellValue("李四");
        row3.createCell(2).setCellValue("2019-08-01");
        row3.createCell(3).setCellValue("否");

        //输出Excel文件
        OutputStream output = response.getOutputStream();
        response.reset();
        response
                .setHeader("Content-disposition", "attachment; filename=demo.xls");
        response.setContentType("application/x-xls");
        wb.write(output);
        output.close();
        return null;
    }


    /**
     * 导出Excel  封装一 提前将要输出的列名封装成对象 表头和数据整成list
     */
    @GetMapping(value = "/out-excel-demo2")
    public String outExcelDemo2(HttpServletResponse response) throws IOException, IllegalAccessException {
        //文件名
        String fileName = "活动报名情况一览表";
        //sheet名
        String sheetName = "报名情况sheet";

        //表头集合，作为表头参数
        List<String> titleList = new ArrayList<>();
        titleList.add("用户账户");
        titleList.add("用户名");
        titleList.add("报名时间");
        titleList.add("是否完成");

        //数据对象，这里模拟手动添加，真实的环境往往是从数据库中得到
        SignOutExcelJSON excelJSON = new SignOutExcelJSON();
        excelJSON.setAccount("18210825916");
        excelJSON.setUsername("张三");
        excelJSON.setSignDate("2019-08-05");
        excelJSON.setFinish("是");
        SignOutExcelJSON excelJSON2 = new SignOutExcelJSON();
        excelJSON2.setAccount("15939305781");
        excelJSON2.setUsername("李四");
        excelJSON2.setSignDate("2019-08-01");
        excelJSON2.setFinish("否");
        //将两个对象加入到集合中，作为数据参数
        List<SignOutExcelJSON> excelJSONList = new ArrayList<>();
        excelJSONList.add(excelJSON);
        excelJSONList.add(excelJSON2);

        //调取封装的方法，传入相应的参数
        HSSFWorkbook workbook = ExcelUtil.createExcel(sheetName, titleList, excelJSONList);

        //输出Excel文件
        OutputStream output = response.getOutputStream();
        response.reset();
        //中文名称要进行编码处理
        response
                .setHeader("Content-disposition", "attachment; filename=" + new String(fileName.getBytes("GB2312"), "ISO8859-1") + ".xls");
        response.setContentType("application/x-xls");
        workbook.write(output);
        output.close();
        return null;
    }
}
